package com.sky.utils;


import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

@Data
@AllArgsConstructor
@Slf4j
public class QnyOssUtil {
    // 七牛云密钥
    private  String accessKey;
    // 密钥
    private  String secretKey;
    // 空间名
    private  String bucket;
    // 域名
    private String domain;
    // 存储区域
    private Region region;
    // 存储路径
    private String path;
    /**
     * 文件上传方法
     * @param bytes     文件字节数组
     * @param fileName  文件名（建议含目录前缀，如：sky-take-out/xxx.jpg）
     * @return          上传后的访问URL
     */
    public String upload2Qiniu(byte[] bytes, String fileName) {
        // 1. 配置存储区域
        Configuration config = new Configuration(region);
        UploadManager uploadManager = new UploadManager(config);

        // 2. 准备上传参数（如需目录，可在此拼接，如："sky-take-out/" + fileName）
        String key = path + "/" + fileName;
        log.info("文件上传路径：{}", key);
        // 3. 生成上传凭证
        Auth auth = Auth.create(accessKey, secretKey);
        String upToken = auth.uploadToken(bucket);

        try {
            // 4. 执行文件上传
            Response response = uploadManager.put(bytes, key, upToken);
            // 5. 解析响应结果
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
            // 6. 构造访问URL（格式：https://域名/文件名）
            String fileUrl = "https://" + domain + "/" + key;
            log.info("七牛云文件上传成功，URL：{}", fileUrl);
            return fileUrl;
        } catch (QiniuException e) {
            // 异常处理：记录详细错误信息
            Response r = e.response;
            log.error("七牛云上传失败，状态码：{}，响应：{}", r.statusCode, r.toString());
            try {
                log.error("七牛云错误详情：{}", r.bodyString());
            } catch (QiniuException ex) {
                log.error("解析七牛云响应体失败", ex);
            }
            throw new RuntimeException("七牛云文件上传失败", e);
        }
    }
    /**
     * 删除七牛云存储的文件
     * @param fileUrl 文件完整URL
     * @return 删除成功返回true，失败返回false
     */
    public boolean deleteFile(String fileUrl) {
        // 1. 检查URL是否有效
        if (fileUrl == null || !fileUrl.startsWith("https://" + domain + "/")) {
            log.error("无效的文件URL：{}，域名不匹配或格式错误", fileUrl);
            return false;
        }

        // 2. 从URL中提取文件名（即key）
        String key = fileUrl.substring(("https://" + domain + "/").length());
        log.info("准备删除文件，key：{}", key);

        // 3. 创建BucketManager实例
        Auth auth = Auth.create(accessKey, secretKey);
        Configuration config = new Configuration(region);
        BucketManager bucketManager = new BucketManager(auth, config);

        // 4. 执行删除操作
        try {
            bucketManager.delete(bucket, key);
            log.info("文件删除成功，URL：{}", fileUrl);
            return true;
        } catch (QiniuException e) {
            // 处理七牛云异常
            Response r = e.response;
            log.error("文件删除失败，URL：{}，错误码：{}，错误信息：{}",
                    fileUrl, r.statusCode, r);
            return false;
        }
    }
}
